package unq.edu.cui.tp.dominio;

import java.util.*;

import org.joda.time.DateTime;
import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.utils.Observable;

import unq.edu.cui.tp.modelo.ventanas.Restriccion;

@Observable
public class Sistema {

	private List<Empleado> empleados = new ArrayList<Empleado>();
	private List<Planificacion> planificaciones = new ArrayList<Planificacion>();
	private List<Restriccion> restricciones = new ArrayList<Restriccion>();	
	
	public void inicializar() {

		List<Dia> diasDisponibles = new ArrayList<Dia>();
		diasDisponibles.add(new Dia("lunes", 6, 12));
		diasDisponibles.add(new Dia("miercoles", 8, 17));
		Disponibilidad disp = new Disponibilidad(diasDisponibles);
		Empleado empleado = new Empleado("Jorge", "Rodriguez", 25789, disp);
		this.getEmpleados().add(empleado);
		this.getRestricciones().add(new Restriccion(empleado, new DateTime("2014-06-25")));
		this.getRestricciones().add(new Restriccion(empleado, new DateTime("2014-08-10")));
		for(DateTime dt : this.semanaActual()){
			this.planificaciones.add(new Planificacion(dt, false));
		}
	}
		/**
	 * Fechas de la semana actual
	 * @return
	 */
	public List<DateTime> semanaActual(){
		List<DateTime> semanaActual = new ArrayList<DateTime>();
		
		Calendar dia = new GregorianCalendar();
		int n = new DateTime().getDayOfWeek();
		while (n > 0) {
			semanaActual.add(new DateTime(dia.getTimeInMillis()));
			dia.add(Calendar.DATE, -1);
			n = n - 1;
		}
		
		Calendar dia1 = new GregorianCalendar();
		n = new DateTime().getDayOfWeek();
		while (n <= 6) {
			dia1.add(Calendar.DATE, 1);
			semanaActual.add(new DateTime(dia1.getTimeInMillis()));		
			n++;
		}
		
		Collections.sort(semanaActual);
		
		return semanaActual;
	}
	/**
	 * Agregar un empleado
	 * @param empleado
	 */
	public void agregarEmpleado(Empleado empleado) {
		if (sePuedeAgregar(empleado)){
			this.getEmpleados().add(empleado);
			ObservableUtils.firePropertyChanged(this, "empleados", this.getEmpleados());
		}
		else{
			throw new NoSePuedeAgregarEmpleado("No se puede agregar el empleado");
		}
	}
	
	private boolean sePuedeAgregar(Empleado empleado) {
		//TODO
		return true;
	}
	
	public void buscar(DateTime fecha, int desde, int hasta) {
		ObservableUtils.firePropertyChanged(this, "empleados", this.getEmpleados());
	}
	/**
	 * Elimina una restriccion
	 * @param restriccionSeleccionada
	 */
		 
	public void eliminarRestriccion(Restriccion restriccionSeleccionada) {
		// elimina la restriccion de su lista de restricciones
		this.getRestricciones().remove(restriccionSeleccionada);
		ObservableUtils.firePropertyChanged(this, "restricciones", this.getRestricciones());
	}	
		
	/**
	 * Agregar una restriccion
	 * @param restriccion
	 */
	public void agregarRestriccion(Restriccion restriccion) {
		this.getRestricciones().add(restriccion);
		ObservableUtils.firePropertyChanged(this, "restricciones", this.getRestricciones());			
	}
	
	/**
	 * Agregar una asignacion a la planificacion
	 * @param planificacion
	 * @param asignacion
	 */
	public void agregarAsignacion(Planificacion planificacion, Asignacion asignacion) {

		for(Planificacion p : this.getPlanificaciones()){
			if(p == planificacion){
				p.agregarAsignacion(asignacion);
				p.setEstado(true);
			}
		}
		ObservableUtils.firePropertyChanged(this, "planificaciones", this.getPlanificaciones());
	}
	
	//////////////////////////////////
	//Getters and setters
	//////////////////////////////////
	public List<Empleado> getEmpleados() {
		return empleados;
	}
	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}
	public List<Planificacion> getPlanificaciones() {
		return planificaciones;
	}
	public void setPlanificaciones(List<Planificacion> planificaciones) {
		this.planificaciones = planificaciones;
	}
	public List<Restriccion> getRestricciones() {
		return restricciones;
	}

	public void setRestricciones(List<Restriccion> restricciones) {
		this.restricciones = restricciones;
	}
	
		
}
